/*CopyRight 2015 By YXKJ Co., Ltd. All Rights Reserved.*/
package com.yx.system;

import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

/**
 * 模型数据操作相关工具类
 * 
 * @author zgq
 */
public class ModelDataUtils {
	/**
	 * 将List里的数据转换为指定类型
	 * 
	 * @param clazz
	 *            目标类型
	 * @param datas
	 *            待转换的数据
	 * @return 转换后的数据
	 * @throws Exception
	 */
	public static <T> List<T> reverse(Class<T> clazz, List<?> datas)
			throws Exception {
		List<T> ret = new ArrayList<T>();
		for (Object obj : datas) {
			ret.add(reverse(clazz, obj));
		}
		return ret;
	}

	/**
	 * 将一个对象转换为指定类型
	 * 
	 * @param clazz
	 *            目标类型
	 * @param data
	 *            待转换的对象
	 * @return 转换后的对象
	 * @throws Exception
	 */
	public static <T> T reverse(Class<T> clazz, Object data) throws Exception {
		T ret = clazz.newInstance();
		Field[] fs = data.getClass().getDeclaredFields();
		for (Field f : fs) {
			PropertyDescriptor pd = new PropertyDescriptor(f.getName(), clazz);
			pd.getWriteMethod().invoke(ret, pd.getReadMethod().invoke(data));
		}
		return ret;
	}

	/**
	 * 根据属性名获得指定对象上的值
	 * 
	 * @param obj
	 *            指定对象
	 * @param fieldName
	 *            属性名
	 * @return 属性值
	 * @throws Exception
	 */
	public static Object getObjByName(Object obj, String fieldName)
			throws Exception {
		String[] fs = fieldName.split("\\.");
		Object ret = new PropertyDescriptor(fs[0], obj.getClass())
				.getReadMethod().invoke(obj);
		if (ret == null || fs.length == 1)
			return ret;
		else
			return getObjByName(ret, fs[1]);
	}
}
